package com.gitee.qdbp.general.common.api.settings.service;

import java.util.List;
import java.util.Map;
import com.gitee.qdbp.able.exception.ServiceException;
import com.gitee.qdbp.able.jdbc.ordering.OrderPaging;
import com.gitee.qdbp.able.jdbc.paging.PageList;
import com.gitee.qdbp.general.common.api.settings.model.SystemConfigCoreBean;
import com.gitee.qdbp.general.common.api.settings.model.SystemConfigCoreWhere;
import com.gitee.qdbp.general.common.enums.ConfigScene;

/**
 * 系统配置项查询接口, 查询指定租户编号的配置项(DataType=ITEM)<br>
 * system_config_core记录只在开发时维护<br>
 * 管理员只能修改configValue, 并保存在system_config_customize表<br>
 * 查询时以system_config_customize表的configValue优先<br>
 * scene分为: platform(平台), manager(管理员), user(用户)
 *
 * @author zhh
 * @version 170802
 */
public interface ISystemConfigItemQueryer {

    /** 查询字符类型的配置值(如果valueType不是text则返回null) **/
    String findTextValue(ConfigScene scene, String tenantCode, String configKey) throws ServiceException;

    /** 查询字符类型的配置值(如果valueType不是text则返回null) **/
    default String findStringValue(ConfigScene scene, String tenantCode, String configKey, String defValue)
            throws ServiceException {
        String value = findTextValue(scene, tenantCode, configKey);
        return value != null ? value : defValue;
    }

    /** 查询字符类型的配置值(如果valueType不是number则返回null) **/
    Double findNumberValue(ConfigScene scene, String tenantCode, String configKey)
            throws ServiceException, NumberFormatException;

    /** 查询字符类型的配置值(如果valueType不是number则返回null) **/
    default Double findNumberValue(ConfigScene scene, String tenantCode, String configKey, Double defValue)
            throws ServiceException {
        try {
            Double number = findNumberValue(scene, tenantCode, configKey);
            return number != null ? number : defValue;
        } catch (NumberFormatException e) {
            return defValue;
        }
    }

    /** 查询字符类型的配置值(如果valueType不是number则返回null) **/
    default Integer findIntegerValue(ConfigScene scene, String tenantCode, String configKey)
            throws ServiceException, NumberFormatException {
        Double number = findNumberValue(scene, tenantCode, configKey);
        return number != null ? number.intValue() : null;
    }

    /** 查询字符类型的配置值(如果valueType不是number则返回null) **/
    default Integer findIntegerValue(ConfigScene scene, String tenantCode, String configKey, Integer defValue)
            throws ServiceException {
        try {
            Integer number = findIntegerValue(scene, tenantCode, configKey);
            return number != null ? number : defValue;
        } catch (NumberFormatException e) {
            return defValue;
        }
    }

    /** 查询字符类型的配置值(如果valueType不是enums则返回null) **/
    String findEnumValue(ConfigScene scene, String tenantCode, String configKey) throws ServiceException;

    /** 查询字符类型的配置值(如果valueType不是object则返回null) **/
    <T> T findObjectValue(ConfigScene scene, String tenantCode, String configKey, Class<T> clazz) throws ServiceException;

    /** 根据KEY查询(不查禁用的) **/
    SystemConfigCoreBean findByKey(ConfigScene scene, String tenantCode, String configKey) throws ServiceException;

    /** 根据KEY查询VALUE(不查禁用的) **/
    default String findConfigValueByKey(ConfigScene scene, String tenantCode, String configKey, String defValue)
            throws ServiceException {
        String value = findConfigValueByKey(scene, tenantCode, configKey);
        return value != null ? value : defValue;
    }

    /** 根据KEY查询VALUE(不查禁用的) **/
    String findConfigValueByKey(ConfigScene scene, String tenantCode, String configKey) throws ServiceException;

    /** 根据KEY查询列表(不查禁用的) **/
    Map<String, SystemConfigCoreBean> listByKeys(ConfigScene scene, String tenantCode, List<String> configKeys);

    /** 根据条件查找 **/
    SystemConfigCoreBean find(ConfigScene scene, String tenantCode, SystemConfigCoreWhere where)
            throws ServiceException;

    /** 根据条件查询列表 **/
    PageList<SystemConfigCoreBean> list(ConfigScene scene, String tenantCode, SystemConfigCoreWhere where,
            OrderPaging paging);
}
